package controllers;

import play.mvc.*;
import play.data.*;
import static play.data.Form.*;
import play.*;
import models.*;
import views.html.pageErreurConnexion;
import views.html.ConsoleAdmin.*;

/**
 * Manage a database of users
 */
public abstract class AdminUtilisateur extends Controller {

	/**
	 * This result directly redirect to application home.
	 */
	public final static Result GO_HOME = redirect(routes.AdminUtilisateur
			.listUtilisateur(0, "id_utilisateur", "asc", ""));

	/**
	 * Handle default path requests, redirect to users list
	 */
	public static Result indexUtilisateur() {
		if (Application.estAdmin()) {
			return GO_HOME;
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Display the paginated list of users.
	 * 
	 * @param page
	 *            Current page number (starts from 0)
	 * @param sortBy
	 *            Column to be sorted
	 * @param order
	 *            Sort order (either asc or desc)
	 * @param filter
	 *            Filter applied on user names
	 */
	public static Result listUtilisateur(final int page, final String sortBy,
			final String order, final String filter) {
		if (Application.estAdmin()) {
			return ok(listUtilisateur.render(
					Utilisateur.page(page, 10, sortBy, order, filter), sortBy,
					order, filter));
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Display the 'edit form' of a existing Utilisateur.
	 * 
	 * @param id
	 *            Id of the user to edit
	 */
	public static Result editUtilisateur(final Long id) {
		if (Application.estAdmin()) {
			final Form<Utilisateur> userForm = form(Utilisateur.class).fill(
					Utilisateur.findById(id));
			return ok(editUtilisateur.render(id, userForm));
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Handle the 'edit form' submission
	 * 
	 * @param id
	 *            Id of the user to edit
	 */
	public static Result updateUtilisateur(final Long id) {
		if (Application.estAdmin()) {
			final Form<Utilisateur> userForm = form(Utilisateur.class)
					.bindFromRequest();
			if (userForm.hasErrors()) {
				return badRequest(editUtilisateur.render(id, userForm));
			}
			if(!Utilisateur.findById(id).getPassword().equals(userForm.get().getPassword())){
			userForm.get().setPassword(controllers.Utile.generateMD5(userForm.get().getPassword()));
			}
			userForm.get().update(id);
			Logger.debug("Mise à jour user "
					+ userForm.get().getIdUtilisateur() + " "
					+ userForm.get().getNom() + " "
					+ userForm.get().getPrenom() + " par user "
					+ session().get("id"));
			flash("success", "Utilisateur " + userForm.get().getPrenom() + " "
					+ userForm.get().getNom() + " has been updated");
			return GO_HOME;
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Display the 'new user form'.
	 */
	public static Result createUtilisateur() {
		if (Application.estAdmin()) {
			final Form<Utilisateur> userForm = form(Utilisateur.class);
			return ok(createUtilisateur.render(userForm));
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Handle the 'new user form' submission
	 */
	public static Result saveUtilisateur() {
		if (Application.estAdmin()) {
			final Form<Utilisateur> userForm = form(Utilisateur.class)
					.bindFromRequest();
			userForm.get().setPassword(controllers.Utile.generateMD5(userForm.get().getPassword()));

			if (userForm.hasErrors()) {
				return badRequest(createUtilisateur.render(userForm));
			}
			userForm.get().save();
			Logger.debug("Création user " + userForm.get().getIdUtilisateur()
					+ " " + userForm.get().getNom() + " "
					+ userForm.get().getPrenom() + " par user "
					+ session().get("id"));
			flash("success", "Utilisateur " + userForm.get().getPrenom() + " "
					+ userForm.get().getNom() + " has been created");
			return GO_HOME;
		} else
			return ok(pageErreurConnexion.render());
	}

	/**
	 * Handle user deletion
	 */
	public static Result deleteUtilisateur(final Long id) {
		if (Application.estAdmin()) {
			final Utilisateur user = Utilisateur.findById(id);
			flash("success", "Utilisateur has been deleted");
			Logger.debug("Suppression user " + user.getIdUtilisateur() + " "
					+ user.getNom() + " " + user.getPrenom() + " par user "
					+ session().get("id"));
			Utilisateur.delete(id);
			return GO_HOME;
		} else
			return ok(pageErreurConnexion.render());
	}

}
